package x.trident.core.micro.core.feign;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import x.trident.core.util.HttpServletUtil;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

/**
 * Feign拦截器，为每个Feign请求添加初始请求带的Header
 * 在使用feign做服务间调用的时候，如何修改请求的头部或编码信息呢，可以通过实现RequestInterceptor接口的apply方法
 * feign在发送请求之前都会调用该接口的apply方法，所以我们也可以通过实现该接口来记录请求发出去的时间点。
 * <p>
 * 会过滤掉Accept属性
 *
 * @author Seven
 * @date 2021-05-07-下午7:25
 */
@Slf4j
public class TridentFeignHeaderProcessInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {

        // 获取当前请求的http请求上下文
        HttpServletRequest request = null;
        try {
            request = HttpServletUtil.getRequest();
        } catch (Exception exception) {
            // 获取不到请求类，则当前进行的不是http请求
            return;
        }

        if (request == null) {
            if (log.isDebugEnabled()) {
                log.debug("被调环境中不存在request对象，则不往header里添加当前请求环境的header!");
            }
            return;
        } else {
            Enumeration<String> headerNames = request.getHeaderNames();
            if (headerNames != null) {
                while (headerNames.hasMoreElements()) {
                    String name = headerNames.nextElement();
                    String ignoreHeader = "Accept";

                    //过滤掉Accept Header
                    if (name.equalsIgnoreCase(ignoreHeader)) {
                        continue;
                    }

                    String values = request.getHeader(name);
                    requestTemplate.header(name, values);
                }
            }
        }
        this.addOtherHeaders(requestTemplate);
    }

    public void addOtherHeaders(RequestTemplate requestTemplate) {
        // to complete
    }
}
